from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import base64

def des3_encrypt(input_string, key):
    """
    3DES 加密函数，将输入的字符串进行 3DES 加密，并返回加密后的字符串。
    
    参数:
    input_string (str): 需要加密的字符串。
    key (bytes): 24 字节的密钥。
    
    返回:
    str: 加密后的 Base64 编码字符串。
    """
    cipher = Cipher(algorithms.TripleDES(key), modes.ECB(), backend=default_backend())
    encryptor = cipher.encryptor()
    
    # 对输入字符串进行填充
    padder = padding.PKCS7(algorithms.TripleDES.block_size).padder()
    padded_data = padder.update(input_string.encode('utf-8')) + padder.finalize()
    
    # 加密数据
    encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
    
    # 使用 Base64 编码
    encrypted_string = base64.b64encode(encrypted_data).decode('utf-8')
    return encrypted_string

def des3_decrypt(encrypted_string, key):
    """
    3DES 解密函数，将输入的加密字符串进行 3DES 解密，并返回解密后的字符串。
    
    参数:
    encrypted_string (str): 需要解密的 Base64 编码字符串。
    key (bytes): 24 字节的密钥。
    
    返回:
    str: 解密后的字符串。
    """
    cipher = Cipher(algorithms.TripleDES(key), modes.ECB(), backend=default_backend())
    decryptor = cipher.decryptor()
    
    # 使用 Base64 解码
    encrypted_data = base64.b64decode(encrypted_string)
    
    # 解密数据
    decrypted_padded_data = decryptor.update(encrypted_data) + decryptor.finalize()
    
    # 去除填充
    unpadder = padding.PKCS7(algorithms.TripleDES.block_size).unpadder()
    decrypted_data = unpadder.update(decrypted_padded_data) + unpadder.finalize()
    
    # 将字节转换为字符串
    decrypted_string = decrypted_data.decode('utf-8')
    return decrypted_string

# 测试加密和解密函数
key = b'123456789012345678901234'  # 3DES 密钥必须是 24 字节长
original_string = "123"
encrypted_string = des3_encrypt(original_string, key)
print(f"Encrypted: {encrypted_string}")

decrypted_string = des3_decrypt(encrypted_string, key)
print(f"Decrypted: {decrypted_string}")
